/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.giant.services.authentication;

import com.giant.authentication.User;
import com.giant.entities.pos.PPos;
import com.giant.exceptions.AutenticacionException;
import com.giant.exceptions.OperacionInvalidaException;
import com.giant.services.IServicioPersistenciaLocal;
import com.giant.services.ServicioPersistencia;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author taticay
 */
@Stateless
public class ServiceUser implements ServiceUserLocal {

    //-----------------------------------------------------------
    // Atributos
    //-----------------------------------------------------------
    /**
     * Interface con referencia al servicio de persistencia en el sistema
     */
    @EJB
    private IServicioPersistenciaLocal persistencia;

    //-----------------------------------------------------------
    // Constructor
    //-----------------------------------------------------------
    /**
     * Constructor de la clase sin argumentos
     */
    public ServiceUser() {
        persistencia = new ServicioPersistencia();
    }

    //-----------------------------------------------------------
    // Métodos
    //-----------------------------------------------------------
    /**
     * Agrega un vendedor al sistema
     *
     * @param vendedor Nuevo vendedor
     * @throws OperacionInvalidaException Excepción lanzada en caso de error
     */
    @Override
    public void agregarUser(User user) throws OperacionInvalidaException {
        try {
            persistencia.create(user);
        } catch (OperacionInvalidaException ex) {
            throw new OperacionInvalidaException(ex.getMessage());
        }
    }

    /**
     * Elimina un vendedor del sistema dado su ID
     *
     * @param id Identificador único del vendedor
     * @throws OperacionInvalidaException Excepción lanzada en caso de error
     */
    @Override
    public void eliminarUser(long id) throws OperacionInvalidaException {
        User v = (User) persistencia.findById(User.class, id);
        try {
            persistencia.delete(v);
        } catch (OperacionInvalidaException ex) {
            throw new OperacionInvalidaException(ex.getMessage());
        }
    }

    /**
     * Devuelve todos los vendedores del sistema
     *
     * @return vendedores Vendedores del sistema
     */
    @Override
    public List<User> getUser() {
        return persistencia.findAll(User.class);
    }

    /**
     * Devuelve todos los vendedores del sistema
     *
     * @return vendedores Vendedores del sistema
     */
    @Override
    public List<User> getUserFilter(String a, Map<String, String> map) {
        return persistencia.executeSql(a, map);
    }

    @Override
    public User ingresar(String userName, String password) throws AutenticacionException {
        String sql = "Select * from user where user_name = '" + userName + "' and password = sha('" + password + "') and status=1";
        List<User> users = persistencia.executeGenericSQLSerialized(sql, User.class);

        if (users.isEmpty()) {
            System.out.println("Invalid Authentication");
            throw new AutenticacionException("The login information is invalid");
        } else {
            return users.get(0);
        }

    }

    @Override
    public boolean changePassword(String username, String oldPassword, String newPassword) throws Exception {

        String sql = "update user set password = sha ('" + newPassword + "') where user_name = '" + username + "' and password = sha('" + oldPassword + "')";
        persistencia.executeGenericSQLAdd(sql);
        return true;
    }

    @Override
    public PPos getUserPos(User user) {
        String query="select p.* from p_pos p join user_pos up on p.id_pos=up.id_pos where up.id_user="+user.getIdUser();
        List<PPos> pos = persistencia.executeGenericSQLSerialized(query, PPos.class);
        if(pos.isEmpty())
            return null;
        return pos.get(0);
    }
}
